package com.h.blog.common.unit;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class SecurityUnits {
    /**
     * 加密
     * 利用随机盐值，对密码进行更安全的加密
     * @param password 注册时 客户所输入的密码(明文)
     * @return 盐值 + 密文(盐值 + 明文 进行的加密)
     */
    public static String encrypt(String password) {
        // 利用 加盐 进行对 MD5进行更高的加密
        // 32位 盐值
        String salt = UUID.randomUUID().toString().replace("-",""); // 随机生成 盐值，并进行处理，把-进行更改成空
        // 32位 密文 ，把盐值和输入的密码进行一起加密
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        // 返回 盐值 + 密文，存储到 数据库 中
        return (salt + securityPassword);
    }

    /**
     * 判断登录输入的密码是否是注册的密码，就是对其使用原盐值进行再次加密，进行判断
     * @param inputPassword 登录时输入的密码
     * @param sqlPassword 从数据库中取出的 盐值+密文 的组成
     * @return 返回是否是一样的 盐值+密文
     */
    public static boolean verify(String inputPassword,String sqlPassword) {
        if (!StringUtils.hasLength(inputPassword)) {
            return false;
        }
        if (sqlPassword == null || sqlPassword.length() != 64) {
            return false;
        }
        // 获取盐值
        String salt = sqlPassword.substring(0,32);
        // 对于 输入的密码 进行加密，把盐值和输入的密码进行一起加密。
        String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));
        // 判断 新生成的密文 和 数据库中的值是否相同
        return sqlPassword.equals((salt + securityPassword));
    }
}
